package br.com.controller.professor;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;



import br.com.arquitetura.controlador.AbstractMBean;
import br.com.arquitetura.excecoes.BDException;
import br.com.arquitetura.servico.ServiceCadastro;
import br.com.controller.util.CPFValidator;
import br.com.data.hibernate.EscolaHibernateDAO;
import br.com.data.hibernate.ProfessorHibernateDAO;
import br.com.data.hibernate.UsuarioHibernateDAO;
import br.com.model.entidade.Escola;
import br.com.model.entidade.Professor;
import br.com.model.entidade.Usuario;
import br.com.util.setup.StringToMD5;

@ManagedBean
@ViewScoped
public class MBProfessor extends AbstractMBean<Professor>{
	
	private static final long serialVersionUID = 1L;
	
	private Professor professor;
	private List<Professor> professores;
	private String senhaRepetida;
	private String escola;
	private List<String> estados;
	private List<String> cidades;
	private ProfessorHibernateDAO professorHibernateDAO;
	private EscolaHibernateDAO escolaHibernateDAO;
	private UsuarioHibernateDAO usuarioHibernateDAO;
	private Professor professorVizualizacao;
	
	@ManagedProperty(value="#{serviceCadastro}")
	private ServiceCadastro serviceCadastro;
	
	
	public void setServiceCadastro(ServiceCadastro serviceCadastro) {
		this.serviceCadastro = serviceCadastro;
	}
	
	public MBProfessor(){
		this.escolaHibernateDAO = (EscolaHibernateDAO) getBean("escolaHibernateDAO");
		this.professorHibernateDAO = (ProfessorHibernateDAO) getBean("professorHibernateDAO");
		this.usuarioHibernateDAO = (UsuarioHibernateDAO) getBean("usuarioHibernateDAO");
		limpar();
		
	}
	
	public void setarProfessorDialog(){
		this.professorVizualizacao = this.professorHibernateDAO.getById(Professor.class, this.professorVizualizacao.getId());
	}
	
	public void gerarMatricula(){
		boolean teste = true;
		
		while(teste){
			Date d = new Date();
			String matricula = (d.getYear()+1900) + "";
			int num = (int) (Math.random() * 10);
			matricula += num + "";
			num = (int) (Math.random() * 10);
			matricula += num + "";
			num = (int) (Math.random() * 10);
			matricula += num + "";
			num = (int) (Math.random() * 10);
			matricula += num + "";
			
			if (usuarioHibernateDAO.getByField(Usuario.class, "matricula", matricula) != null){
				if (usuarioHibernateDAO.getByField(Usuario.class, "matricula", matricula).isEmpty()){
					this.professor.getUsuario().setMatricula(matricula);
					teste = false;
				}
			}
		}
		
		
	}

	public void carregarCidades(){
		if(professor.getEstado().contentEquals("RN")){
			System.out.println("selecionou rn");
			this.cidades = new ArrayList<String>();
			cidades.add("Natal");
			cidades.add("Parnamirim");
			cidades.add("Macaiba");
		}
		if(professor.getEstado().contentEquals("PB")){
			this.cidades = new ArrayList<String>();
			System.out.println("selecionou PB");
			cidades.add("Campina Grande");
			cidades.add("Patos");
			cidades.add("Joao Pessoa");
		}
		if(professor.getEstado().contentEquals("")){
			this.cidades = new ArrayList<String>();
			System.out.println("selecionou nada");
			cidades.add("Selecione um estado");
			
		}
	}
	
	
	public void adicionarEscola(){
		System.out.println("passei");
		if(professor.getEscolas() == null){
			List<Escola> escolas = new ArrayList<Escola>();
			try {
				escolas.add(escolaHibernateDAO.getByField(Escola.class,"nome", escola).get(0));
			} catch (BDException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			professor.setEscolas(escolas);
		}else{
			try {
				professor.getEscolas().add(escolaHibernateDAO.getByField(Escola.class,"nome", escola).get(0));
			} catch (BDException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
	public void excluir(){
		try {
			System.out.println(professor.getId());
			serviceCadastro.excluir(professor);
			this.limpar();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Professor excluido com sucesso!"));
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao excluir!"));
		}
	}
	
	public void editar(){
		try {
			System.out.println("entrei no editar, o nome do professor eh " + professor.getUsuario().getNome());
				
			serviceCadastro.atualizar(professor);
			this.limpar();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Professor cadastrado com sucesso!"));
		
			
			
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao cadastrar!"));
		}
	}
	
	
	public void teste(){
		CPFValidator.validar(this.professor.getUsuario().getCpf());
	}
	
	public void cadastrar(){
		try {
			
			if (this.professor.getUsuario().getSenha().compareTo(senhaRepetida)==0){
				List<String> permissoes = new ArrayList<String>();
				permissoes.add("PROFESSOR");
				professor.getUsuario().setPermissoes(permissoes);
				professor.getUsuario().setSenha(StringToMD5.md5(senhaRepetida));
				
				//Testando cpf
				if (!this.professor.getUsuario().getCpf().isEmpty() && CPFValidator.validar(this.professor.getUsuario().getCpf())){
					Usuario u = professor.getUsuario();
					
					this.gerarMatricula();
					
					serviceCadastro.salvar(u);
					
					professor.setUsuario(u);
					
					serviceCadastro.salvar(professor);
					this.limpar();
					FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Professor cadastrado com sucesso!"));
				}else{
					addFacesErrorMessage("CPF Inválido");
				}
				

			}else{
				FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Aviso", "Senhas nao conferem!"));
			}
			
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao cadastrar!"));
		}
	}
	
	
	public void limpar(){
		this.professorVizualizacao = new Professor();
		professorVizualizacao.setEscolas(new ArrayList<Escola>());
		this.professor = new Professor();
		this.professores = new ArrayList<Professor>();
		this.estados = new ArrayList<String>();
		this.cidades = new ArrayList<String>();
		this.estados.add("RN");
		this.estados.add("PB");
		this.senhaRepetida = "";
		this.escola = "";
		try {
			this.professores = professorHibernateDAO.listAll(Professor.class);
		} catch (BDException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	
	
	public Professor getProfessor() {
		return professor;
	}

	public void setProfessor(Professor professor) {
		this.professor = professor;
	}

	public List<Professor> getProfessores() {
		return this.professores;
	}

	public void setProfessores(List<Professor> professores) {
		
		
		this.professores = professores;
	}

	public String getSenhaRepetida() {
		return senhaRepetida;
	}

	public void setSenhaRepetida(String senhaRepetida) {
		this.senhaRepetida = senhaRepetida;
	}

	public String getEscola() {
		return escola;
	}

	public void setEscola(String escola) {
		this.escola = escola;
	}

	public List<String> getEstados() {
		return estados;
	}

	public void setEstados(List<String> estados) {
		this.estados = estados;
	}

	public List<String> getCidades() {
		return cidades;
	}

	public void setCidades(List<String> cidades) {
		this.cidades = cidades;
	}

	public Professor getProfessorVizualizacao() {
		return professorVizualizacao;
	}

	public void setProfessorVizualizacao(Professor professorVizualizacao) {
		this.professorVizualizacao = professorVizualizacao;
	}
	
	
	
}
